package com.zhentao.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhentao.config.HttpClientUtil;
import com.zhentao.config.TokenUtil;
import com.zhentao.pojo.WxUser;
import com.zhentao.service.WxUserService;
import com.zhentao.mapper.WxUserMapper;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Date;


/**
* @author Lenovo
* @description 针对表【wx_user(简化版微信用户表（测试用）)】的数据库操作Service实现
* @createDate 2025-09-27 14:03:21
*/
@Service
public class WxUserServiceImpl extends ServiceImpl<WxUserMapper, WxUser>
    implements WxUserService{
    @Value("${wechat.miniapp.appid}")
    private String appid;

    @Value("${wechat.miniapp.secret}")
    private String secret;
    @Override
    public WxUser login(String code, String nickname, String avatarUrl) {
        // 1. 调用微信接口，通过code换取openid
        // 拼接微信官方接口地址，用于通过小程序临时登录凭证 code 换取 openid 和 session_key
        // 参数依次为：小程序 appid、小程序 secret、前端传来的 code、固定授权类型 authorization_code
        String wxUrl = String.format(
                // 微信官方提供的“小程序登录凭证校验”接口地址（固定）
                "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
                appid, secret, code
        );
        String wxResult = HttpClientUtil.doGet(wxUrl);
        JSONObject wxJson = JSONObject.parseObject(wxResult);
        String openid = wxJson.getString("openid");
        if (openid == null) {
            throw new RuntimeException("微信接口调用失败：" + wxResult);
        }

        // 2. 查数据库，判断用户是否已存在
        WxUser user = lambdaQuery()
                .eq(WxUser::getOpenid, openid)
                .one();

        // 3. 生成Token（示例用UUID，生产建议用JWT）
        String token = TokenUtil.generateToken();
        Date tokenExpires = new Date(System.currentTimeMillis() + 24 * 3600 * 1000); // Token有效期24小时

        if (user == null) {
            // 3.1 新用户：插入数据库
            user = new WxUser();
            user.setOpenid(openid);
            user.setNickname(nickname);
            user.setAvatarUrl(avatarUrl);
            user.setToken(token);
            user.setTokenExpires(tokenExpires);
            user.setCreateTime(new Date());
            save(user);
        } else {
            // 3.2 老用户：更新Token和用户信息
            user.setNickname(nickname);
            user.setAvatarUrl(avatarUrl);
            user.setToken(token);
            user.setTokenExpires(tokenExpires);
            updateById(user);
        }

        return user;

    }
}





